<?php
define('Acan_Afun_ip',1);
//纯真IP查询方法
function Afun_ip_info($ip){
	$ipNum = Afun_ipnum($ip);
	if($fd = @fopen( AcanROOT."/adata/ip/ip.dat", "rb" )){
		$DataBegin = fread( $fd, 4 );
		$DataEnd = fread( $fd, 4 );
		$ipbegin = implode( "", unpack( "L", $DataBegin ) );
		if ( $ipbegin < 0 ){
			$ipbegin += pow( 2, 32 );
		}
		$ipend = implode( "", unpack( "L", $DataEnd ) );
		if ( $ipend < 0 ){
			$ipend += pow( 2, 32 );
		}
		$ipAllNum = ( $ipend - $ipbegin ) / 7 + 1;
		$BeginNum = 0;
		$EndNum = $ipAllNum;
		while ( $ipNum < $ip1num || $ip2num < $ipNum ){
			$Middle = intval( ( $EndNum + $BeginNum ) / 2 );
			fseek( $fd, $ipbegin + 7 * $Middle );
			$ipData1 = fread( $fd, 4 );
			if ( strlen( $ipData1 ) < 4 ){
				fclose( $fd );
				return "System Error";
			}
			$ip1num = implode( "", unpack( "L", $ipData1 ) );
			if ( $ip1num < 0 ){
				$ip1num += pow( 2, 32 );
			}
			if ( $ipNum < $ip1num ){
				$EndNum = $Middle;
			}else{
				$DataSeek = fread( $fd, 3 );
				if ( strlen( $DataSeek ) < 3 ){
					fclose( $fd );
					return "System Error";
				}
				$DataSeek = implode( "", unpack( "L", $DataSeek.chr( 0 ) ) );
				fseek( $fd, $DataSeek );
				$ipData2 = fread( $fd, 4 );
				if ( strlen( $ipData2 ) < 4 ){
					fclose( $fd );
					return "System Error";
				}
				$ip2num = implode( "", unpack( "L", $ipData2 ) );
				if ( $ip2num < 0 ){
					$ip2num += pow( 2, 32 );
				}
				if ( $ip2num < $ipNum ){
					if ( $Middle == $BeginNum ){
						fclose( $fd );
						return "Unknown";
					}
					$BeginNum = $Middle;
				}
			}
		}
		$ipFlag = fread( $fd, 1 );
		if ( $ipFlag == chr( 1 ) ){
			$ipSeek = fread( $fd, 3 );
			if ( strlen( $ipSeek ) < 3 )
			{
				fclose( $fd );
				return "System Error";
			}
			$ipSeek = implode( "", unpack( "L", $ipSeek.chr( 0 ) ) );
			fseek( $fd, $ipSeek );
			$ipFlag = fread( $fd, 1 );
		}
		if ( $ipFlag == chr( 2 ) ){
			$AddrSeek = fread( $fd, 3 );
			if ( strlen( $AddrSeek ) < 3 ){
				fclose( $fd );
				return "System Error";
			}
			$ipFlag = fread( $fd, 1 );
			if ( $ipFlag == chr( 2 ) ){
				$AddrSeek2 = fread( $fd, 3 );
				if ( strlen( $AddrSeek2 ) < 3 ){
					fclose( $fd );
					return "System Error";
				}
				$AddrSeek2 = implode( "", unpack( "L", $AddrSeek2.chr( 0 ) ) );
				fseek( $fd, $AddrSeek2 );
			}else{
				fseek( $fd, -1, SEEK_CUR );
			}
			while ( ( $char = fread( $fd, 1 ) ) != chr( 0 ) ){
				$ipAddr2 .= $char;
			}
			$AddrSeek = implode( "", unpack( "L", $AddrSeek.chr( 0 ) ) );
			fseek( $fd, $AddrSeek );
			while ( ( $char = fread( $fd, 1 ) ) != chr( 0 ) ){
				$ipAddr1 .= $char;
			}
		}
		fseek( $fd, -1, SEEK_CUR );
		while ( ( $char = fread( $fd, 1 ) ) != chr( 0 ) ){
			$ipAddr1 .= $char;
		}
		$ipFlag = fread( $fd, 1 );
		if ( $ipFlag == chr( 2 ) ){
			$AddrSeek2 = fread( $fd, 3 );
			if ( strlen( $AddrSeek2 ) < 3 ){
				fclose( $fd );
				return "System Error";
			}
			$AddrSeek2 = implode( "", unpack( "L", $AddrSeek2.chr( 0 ) ) );
			fseek( $fd, $AddrSeek2 );
		}else{
			fseek( $fd, -1, SEEK_CUR );
		}
/*		while ( ( $char = fread( $fd, 1 ) ) != chr( 0 ) ){
			echo $char;
			$ipAddr2 .= $char;
		}
*/		fclose( $fd );
		if ( preg_match( "/http/i", $ipAddr2 ) ){
			$ipAddr2 = "";
		}
		$ipaddr = $ipAddr1.",{$ipAddr2}";
		$ipaddr = preg_replace( "/CZ88\\.NET/is", "", $ipaddr );
		$ipaddr = preg_replace( "/^\\s*/is", "", $ipaddr );
		$ipaddr = preg_replace( "/\\s*\$/is", "", $ipaddr );
		if ( preg_match( "/http/i", $ipaddr ) || $ipaddr == "" ){
			$ipaddr = "";
		}
		if ( 0 < count( explode( " ", $ipaddr ) ) ){
			$ipaddrArr = explode( ",", $ipaddr );
		}
		$ipaddrArr[0] = Afun_charset($ipaddrArr[0]);
		$ipaddrArr[1] = Afun_charset($ipaddrArr[1]);
		$ipr=array(	"num"=>"$ipNum",
					"city"=>"$ipaddrArr[0]",
					"add"=>"$ipaddrArr[1]");
//		print_r($ipr);
		return $ipr;
	}
}

//ip转数字
function Afun_ipnum($str){
	$ip = explode( ".", $str );
	$ipnum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
	return $ipnum;
}

?>